//
//  YKDeviceKit.m
//  DeviceInfoDemo
//
//  Created by Daniel Yao on 17/3/23.
//  Copyright © 2017年 Daniel Yao. All rights reserved.
//

#import "DYDeviceInfo.h"
//获取idfa
#import <AdSupport/ASIdentifierManager.h>
//获取mac
#include <sys/sysctl.h>
#include <sys/socket.h>
#include <net/if.h>
#include <net/if_dl.h>

#import <sys/utsname.h>

#import <CoreTelephony/CTTelephonyNetworkInfo.h>
#import <CoreTelephony/CTCarrier.h>

#ifdef DEBUG
#define DYLog(...) NSLog(@"%s\n %@\n\n", __func__, [NSString stringWithFormat:__VA_ARGS__])
#else
#define DYLog(...)
#endif

@implementation DYDeviceInfo

+(NSString *)dy_getDeviceIDFA{
    ASIdentifierManager *asIM = [[ASIdentifierManager alloc] init];
    NSString *idfaStr = [asIM.advertisingIdentifier UUIDString];
    
    //DYLog(@"idfaStr------》%@",idfaStr);
    return (idfaStr?:@"");
}

+(NSString *)dy_getDeviceIDFV{
    NSString* idfvStr      = [[UIDevice currentDevice] identifierForVendor].UUIDString;
    
    //DYLog(@"idfvStr------》%@",idfvStr);
    return (idfvStr?:@"");
}
//Git上的erica的UIDevice扩展文件，以前可用但由于IOKit framework没有公开，所以也无法使用。就算手动导入，依旧无法使用，看来获取IMEI要失败了,同时失败的还有IMSI。不过还存在另外一种可能，Stack Overflow上有人提供采用com.apple.coretelephony.Identity.get entitlement方法，but device must be jailbroken；在此附上链接，供大家参考：http://stackoverflow.com/questions/16667988/how-to-get-imei-on-iphone-5/16677043#16677043
+(NSString *)dy_getDeviceIMEI{
    NSString* imeiStr = @"回头吧，翻遍国内外了，failed，快看代码注释";
    return imeiStr;
}

+(NSString*)dy_getDeviceMAC{
    int mib[6];
    size_t len;
    char *buf;
    unsigned char *ptr;
    struct if_msghdr *ifm;
    struct sockaddr_dl *sdl;
    
    mib[0] = CTL_NET;
    mib[1] = AF_ROUTE;
    mib[2] = 0;
    mib[3] = AF_LINK;
    mib[4] = NET_RT_IFLIST;
    
    if ((mib[5] = if_nametoindex("en0")) == 0) {
        printf("Error: if_nametoindex error\n");
        return @"";
    }
    
    if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0) {
        printf("Error: sysctl, take 1\n");
        return @"";
    }
    
    if ((buf = malloc(len)) == NULL) {
        printf("Could not allocate memory. error!\n");
        return @"";
    }
    
    if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) {
        printf("Error: sysctl, take 2");
        free(buf);
        return @"";
    }
    
    ifm = (struct if_msghdr *)buf;
    sdl = (struct sockaddr_dl *)(ifm + 1);
    ptr = (unsigned char *)LLADDR(sdl);
    NSString *macStr = [NSString stringWithFormat:@"%02X:%02X:%02X:%02X:%02X:%02X",*ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5)];
    free(buf);
    
    //DYLog(@"macStr------》%@",macStr);
    return (macStr?:@"");
}
+(NSString*)dy_getDeviceUUID{
    
    CFUUIDRef uuid = CFUUIDCreate(NULL);
    assert(uuid != NULL);
    CFStringRef uuidStr = CFUUIDCreateString(NULL, uuid);
    
    //DYLog(@"uuidStr------》%@",uuidStr);
    NSString *uuidstr = (__bridge NSString *)(uuidStr);
    
    return uuidstr?:@"";
}
//no way，UDID是肯定要被苹果拒绝的，炸了！Stack Overflow提供了另外一种方法，越狱可尝试：http://stackoverflow.com/questions/27602368/how-to-get-serial-number-of-a-device-using-iokit-in-ios8-as-ioplatformserialnumb/27686125#27686125
+(NSString*)dy_getDeviceUDID{
    NSString* udidStr = @"回头吧，翻遍国内外了，failed，快来看注释";
    
    return udidStr;
}

+(NSString*)dy_getDeviceName
{
    return [[UIDevice currentDevice] model];
}

+(NSString*)dy_getDeviceSystemVersion
{
    return [[UIDevice currentDevice] systemVersion];
}


+(NSString*)dy_getAppVersion
{
    NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
    
//    // 当前应用版本号码   int类型
//    NSString *appCurVersionNum = [infoDictionary objectForKey:@"CFBundleVersion"];
    
    // 当前应用软件版本  比如：1.0.1
    NSString *appCurVersion = [infoDictionary objectForKey:@"CFBundleShortVersionString"];
    return appCurVersion;
}


+(NSString*)dy_getAppBuild
{
    NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
    
    // 当前应用版本号码   int类型
    NSString *appCurVersion = [infoDictionary objectForKey:@"CFBundleVersion"];
    return appCurVersion;
}


+(NSString*)dy_getTelephonyNetworkInfo
{
    CTTelephonyNetworkInfo *info = [[CTTelephonyNetworkInfo alloc] init];
    CTCarrier *carrier = info.subscriberCellularProvider;
    //NSLog(@"运营商:%@", carrier.carrierName);
    return (carrier.carrierName?carrier.carrierName:@"");
}

+(NSString*)dy_getTelephonyNetworkInfoInt
{
    CTTelephonyNetworkInfo *info = [[CTTelephonyNetworkInfo alloc] init];
    CTCarrier *carrier = info.subscriberCellularProvider;
//    运营商 0：未知，1：中国移动，2：中国电信，3：中国联通，4：中国铁通    用户设备信息（每一次请求都带上）
    NSString *result = @"0";
    NSString *carrierName = carrier.carrierName;
    if ([carrierName isEqualToString:@"中国移动"]) {
        result = @"1";
    }
    else if ([carrierName isEqualToString:@"中国电信"])
    {
        result = @"2";
    }
    else if ([carrierName isEqualToString:@"中国联通"])
    {
        result = @"3";
    }
    else if ([carrierName isEqualToString:@"中国铁通"])
    {
        result = @"4";
    }
    
    return result;
}

+(NSString*)dy_getDeviceScreenPx
{
    
    CGRect rect = [[UIScreen mainScreen] bounds];
    CGSize size = rect.size;
    CGFloat width = size.width;
    CGFloat height = size.height;
    CGFloat scale_screen = [UIScreen mainScreen].scale;
    return [NSString stringWithFormat:@"%.0f*%.0f",width*scale_screen ,height*scale_screen];
}

+ (NSString*)dy_getDeviceModelName {
    struct utsname systemInfo;
    uname(&systemInfo);
    NSString *deviceModel = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
    if ([deviceModel isEqualToString:@"iPhone3,1"])
        return @"iPhone 4";
    if ([deviceModel isEqualToString:@"iPhone3,2"])
        return @"iPhone 4";
    if ([deviceModel isEqualToString:@"iPhone3,3"])
        return @"iPhone 4";
    if ([deviceModel isEqualToString:@"iPhone4,1"])
        return @"iPhone 4S";
    if ([deviceModel isEqualToString:@"iPhone5,1"])
        return @"iPhone 5";
    if ([deviceModel isEqualToString:@"iPhone5,2"])
        return @"iPhone 5 (GSM+CDMA)";
    if ([deviceModel isEqualToString:@"iPhone5,3"])
        return @"iPhone 5c (GSM)";
    if ([deviceModel isEqualToString:@"iPhone5,4"])
        return @"iPhone 5c (GSM+CDMA)";
    if ([deviceModel isEqualToString:@"iPhone6,1"])
        return @"iPhone 5s (GSM)";
    if ([deviceModel isEqualToString:@"iPhone6,2"])
        return @"iPhone 5s (GSM+CDMA)";
    if ([deviceModel isEqualToString:@"iPhone7,1"])
        return @"iPhone 6 Plus";
    if ([deviceModel isEqualToString:@"iPhone7,2"])
        return @"iPhone 6";
    if ([deviceModel isEqualToString:@"iPhone8,1"])
        return @"iPhone 6s";
    if ([deviceModel isEqualToString:@"iPhone8,2"])
        return @"iPhone 6s Plus";
    if ([deviceModel isEqualToString:@"iPhone8,4"])
        return @"iPhone SE";
    if ([deviceModel isEqualToString:@"iPhone9,1"])
        return @"iPhone 7";
//        return @"国行、日版、港行iPhone 7";
    if ([deviceModel isEqualToString:@"iPhone9,2"])
        return @"iPhone 7 Plus";
//        return @"港行、国行iPhone 7 Plus";
    if ([deviceModel isEqualToString:@"iPhone9,3"])
        return @"iPhone 7";
//        return @"美版、台版iPhone 7";
    if ([deviceModel isEqualToString:@"iPhone9,4"])
        return @"iPhone 7 Plus";
//        return @"美版、台版iPhone 7 Plus";
    if ([deviceModel isEqualToString:@"iPhone10,1"])
        return @"iPhone_8";
    if ([deviceModel isEqualToString:@"iPhone10,4"])
        return @"iPhone_8";
    if ([deviceModel isEqualToString:@"iPhone10,2"])
        return @"iPhone_8_Plus";
    if ([deviceModel isEqualToString:@"iPhone10,5"])
        return @"iPhone_8_Plus";
    if ([deviceModel isEqualToString:@"iPhone10,3"])
        return @"iPhone_X";
    if ([deviceModel isEqualToString:@"iPhone10,6"])
        return @"iPhone_X";
    if ([deviceModel isEqualToString:@"iPod1,1"])
        return @"iPod Touch 1G";
    if ([deviceModel isEqualToString:@"iPod2,1"])
        return @"iPod Touch 2G";
    if ([deviceModel isEqualToString:@"iPod3,1"])
        return @"iPod Touch 3G";
    if ([deviceModel isEqualToString:@"iPod4,1"])
        return @"iPod Touch 4G";
    if ([deviceModel isEqualToString:@"iPod5,1"])
        return @"iPod Touch (5 Gen)";
    if ([deviceModel isEqualToString:@"iPad1,1"])
        return @"iPad";
    if ([deviceModel isEqualToString:@"iPad1,2"])
        return @"iPad 3G";
    if ([deviceModel isEqualToString:@"iPad2,1"])
        return @"iPad 2 (WiFi)";
    if ([deviceModel isEqualToString:@"iPad2,2"])
        return @"iPad 2";
    if ([deviceModel isEqualToString:@"iPad2,3"])
        return @"iPad 2 (CDMA)";
    if ([deviceModel isEqualToString:@"iPad2,4"])
        return @"iPad 2";
    if ([deviceModel isEqualToString:@"iPad2,5"])
        return @"iPad Mini (WiFi)";
    if ([deviceModel isEqualToString:@"iPad2,6"])
        return @"iPad Mini";
    if ([deviceModel isEqualToString:@"iPad2,7"])
        return @"iPad Mini (GSM+CDMA)";
    if ([deviceModel isEqualToString:@"iPad3,1"])
        return @"iPad 3 (WiFi)";
    if ([deviceModel isEqualToString:@"iPad3,2"])
        return @"iPad 3 (GSM+CDMA)";
    if ([deviceModel isEqualToString:@"iPad3,3"])
        return @"iPad 3";
    if ([deviceModel isEqualToString:@"iPad3,4"])
        return @"iPad 4 (WiFi)";
    if ([deviceModel isEqualToString:@"iPad3,5"])
        return @"iPad 4";
    if ([deviceModel isEqualToString:@"iPad3,6"])
        return @"iPad 4 (GSM+CDMA)";
    if ([deviceModel isEqualToString:@"iPad4,1"])
        return @"iPad Air (WiFi)";
    if ([deviceModel isEqualToString:@"iPad4,2"])
        return @"iPad Air (Cellular)";
    if ([deviceModel isEqualToString:@"iPad4,4"])
        return @"iPad Mini 2 (WiFi)";
    if ([deviceModel isEqualToString:@"iPad4,5"])
        return @"iPad Mini 2 (Cellular)";
    if ([deviceModel isEqualToString:@"iPad4,6"])
        return @"iPad Mini 2";
    if ([deviceModel isEqualToString:@"iPad4,7"])
        return @"iPad Mini 3";
    if ([deviceModel isEqualToString:@"iPad4,8"])
        return @"iPad Mini 3";
    if ([deviceModel isEqualToString:@"iPad4,9"])
        return @"iPad Mini 3";
    if ([deviceModel isEqualToString:@"iPad5,1"])
        return @"iPad Mini 4 (WiFi)";
    if ([deviceModel isEqualToString:@"iPad5,2"])
        return @"iPad Mini 4 (LTE)";
    if ([deviceModel isEqualToString:@"iPad5,3"])
        return @"iPad Air 2";
    if ([deviceModel isEqualToString:@"iPad5,4"])
        return @"iPad Air 2";
    if ([deviceModel isEqualToString:@"iPad6,3"])
        return @"iPad Pro 9.7";
    if ([deviceModel isEqualToString:@"iPad6,4"])
        return @"iPad Pro 9.7";
    if ([deviceModel isEqualToString:@"iPad6,7"])
        return @"iPad Pro 12.9";
    if ([deviceModel isEqualToString:@"iPad6,8"])
        return @"iPad Pro 12.9";
    if ([deviceModel isEqualToString:@"AppleTV2,1"])
        return @"Apple TV 2";
    if ([deviceModel isEqualToString:@"AppleTV3,1"])
        return @"Apple TV 3";
    if ([deviceModel isEqualToString:@"AppleTV3,2"])
        return @"Apple TV 3";
    if ([deviceModel isEqualToString:@"AppleTV5,3"])
        return @"Apple TV 4";
    if ([deviceModel isEqualToString:@"i386"])
        return @"Simulator";
    if ([deviceModel isEqualToString:@"x86_64"])
        return @"Simulator";
    return deviceModel;
    
}
@end
